%
% @brief 常用工具类
% @author 41204@qq.com / 2025-09-29
% @note 本类中的函数均以 Static 方式定义，以方便使用。
%

classdef utils
    methods(Static)
        %% 解析字符串表示的键值对
        % @author 41204@qq.com / 2025-09-29
        % @param str [string] 要解析的字符口串，如 'SAMPLES=12003840;SIGNALBW=200000000;RMS=2311;PAR=23.032;'
        % @param fschar [string] str 中用于分隔各字段的分隔符，如: ','(默认值) 或 ';' 等
        % @param kvschar [string] str 中用于分隔字段名和字段值的分隔符，如: '='(默认值), ':' 等
        % @return kv[struct] 解析出来的键值对
        function data = parse_kvargs(str, fschar, kvschar)            
            if nargin < 2
                fschar = ','; % fschar 默认值
            end
            
            if nargin < 3    
                kvschar = '='; % kvschar 默认值
            end
            
            % 去掉末尾多余的分号和空格
            str = strtrim(str);
            if str(end) == fschar
                str(end) = [];
            end
            
            % 按分号分割为字段
            fields = strsplit(str, fschar);
            
            % 逐个字段解析为键值对
            data = struct();
            for i = 1:length(fields)
                kv = strsplit(fields{i}, kvschar);
                key = strtrim(kv{1});
                value = strtrim(kv{2});
                key = regexprep(key, '[^_a-zA-Z0-9]', '_'); % 将非字母数字字符替换为下划线（保留字母、数字）
                data.(key) = value;
            end
        end

        %% 将复数数组保存为交错的float32格式
        % 格式：实部1, 虚部1, 实部2, 虚部2, ...
        function save_complex_interleaved(complexData, filename)            
            % 转换为float32并交错排列
            realPart = single(real(complexData));
            imagPart = single(imag(complexData));
            
            % 创建交错数据 [实部1, 虚部1, 实部2, 虚部2, ...]
            interleavedData = zeros(1, numel(complexData)*2, 'single');
            interleavedData(1:2:end) = realPart(:);
            interleavedData(2:2:end) = imagPart(:);
            
            % 写入文件
            fid = fopen(filename, 'wb');
            fwrite(fid, interleavedData, 'float32');
            fclose(fid);
            
            fprintf('交错格式数据已保存到: %s\n', filename);
        end
    end
end
